使用状态机
使用状态定义Kanzi 应用程序在不同状态下的外观和行为。例如,您可以使用状态:
- 设置布局中项的大小以在项被选定时突出项。
- 应用程序处于特定状态时,显示或隐藏用户界面的某些部分。
- 根据应用程序的状态启用或禁用应用程序中的控件,例如按钮。
- 动画化应用程序。
在状态中设置的属性会重写默认、继承和本地属性值。 请参阅属性优先级。
您可以通过以下方式定义两种状态之间的变化:
- 为状态组设置控制器属性,为每个状态设置该属性的值。这些可以是隐式属性,例如按钮 (Button)节点的为向下 (Is Down) 属性。属性更改时的状态变化,可以是节点的固有逻辑的一部分,也可以是指定的设置属性 (Set Property) 动作或动画。请参阅使用控制器属性设置状态。
- 使用状态机 (State Manager) 动作转到状态 (Go to State)、下一状态 (Next State) 和上一状态 (Previous State)。如果您使用状态机 (State Manager) 动作和控制器属性,请注意当控制器属性更改时,它会重写之前设置的状态。请参阅使用状态机 (State Manager) 动作设置状态。
通过完成以下教程之一学习如何使用状态机:
创建状态机
在您的 Kanzi 应用程序中使用状态机控制节点状态。
例如,状态机可以定义切换按钮的状态。状态机设置切换按钮打开和关闭时的外观。
要创建状态机:
- 在工程 (Project) 中选择2D 切换按钮 (Toggle button 2D) 节点并在状态工具 (State Tools) 中点击创建状态机 (Create State Manager)。
您可以在预览 (Preview) 窗口下方找到状态工具 (State Tools) 窗口。
Kanzi Studio 会新建状态机,并将其分配给2D 切换按钮 (Toggle button 2D) 节点。
- 在状态工具 (State Tools) 中点击两次创建状态 (Create State) 创建两个状态,双击每个状态的名称,然后重命名状态。
例如,将一个状态命名为 On,另一个命名为 Off。
On 状态定义切换按钮打开时应用程序的状态,Off 状态按钮定义切换按钮关闭时应用程序的状态。
要删除某个状态,右键点击并选择 删除 (Delete)。
- 使用状态工具 (State Tools) 定义切换按钮指示灯在哪个位置处于打开和关闭状态:
- 定位切换按钮指示灯,并在状态工具 (State Tools) 中点击On 状态下方的 以保存处于该状态的指示灯的当前位置。
例如,在预览 (Preview) 中使用节点工具 (Node tool) 定位指示灯。
- 对Off 状态重复上一步骤,并在状态工具 (State Tools) 中保存处于该状态的切换按钮指示灯的当前位置。
使用控制器属性设置状态
在状态机中,您为控制器属性 (Controller Property) 选择的属性值定义状态组中的各个状态处于活动状态时的条件。状态机中的各个状态组可以使用不同的控制器属性。
您还可以使用自定义属性类型作为状态组的控制器属性。请参阅教程:创建组合仪表指示灯。
要使用控制器属性:
- 创建状态机,并设置节点以使用该状态机。请参阅创建状态机。
例如,创建设置两种状态下切换按钮外观的状态机。 - 在状态工具 (State Tools) 中点击<No Controller Property> 下拉菜单并选择一个属性。要创建自定义控制器属性,点击 <No Controller Property> 下拉菜单并选择 + 创建属性类型 (+ Create Property Type)。
例如,选择按钮 (Button) > 切换状态 (Toggle State) 属性。当您设置切换状态 (Toggle State) 作为控制切换按钮状态的状态机的控制器属性时,状态机根据该属性的值迁移到一种状态。
- 在状态工具 (State Tools) 中,为每个状态设置控制器属性的值。
例如:- 对于On 状态,将该值设为 1。
- 对于Off 状态,仍将该值设为 0。
- 在状态工具 (State Tools) 中点击编辑状态机 (Edit State Manager) 停用状态工具 (State Tools)。
当您在预览 (Preview) 中点击切换按钮时,可切换您在2D 切换按钮 (Toggle button 2D) 节点中创建的状态机所定义的On 和Off 状态。
使用状态机 (State Manager) 动作设置状态
使用状态机 (State Manager) 动作设置Kanzi 应用程序进入不同的状态。
要在状态机中设置状态,您可以使用这些动作:
- 转到状态 (Go to State) 动作将状态机设置为您在该动作中定义的状态。请参阅将状态机设置成特定状态。
- 下一状态 (Next State) 和上一状态 (Previous State) 动作将状态机设置为在该动作中定义的状态组中的下一个或上一个状态。请参阅将状态机设置成下一个或上一个状态。
将状态机设置成特定状态
使用转到状态 (Go to State) 动作将状态机设置成特定状态。
要将状态机设置成特定状态:
- 创建内容,您要定义其处于不同状态时的外观和行为。
例如,使用出厂内容 (Factory Content) 中的汽车 (Car)。 请参阅使用出厂内容 (Factory Content) 资产。
- 创建状态机和状态,您可在其中设置您在上一步中创建的内容的外观和行为。请参阅创建状态机。
例如,为 Camera_Root 节点创建一个状态机,有三个状态,名称分别为 Brakes、Roof 和 Suspension,每种都从不同角度显示汽车。请参阅使用摄像机 (Camera) 节点。
- 将状态机设置成特定状态:
- 创建或选择要用于将应用程序设置成状态机中特定状态的节点,为该节点添加用于更改状态的触发器。
例如,创建一个按钮 (Button) 节点并向其添加一个按钮: 点击 (Button:Click) 触发器。请参阅使用触发器。
- 在用于将状态机设置成特定状态的触发器的节点组件 (Node Components) > 触发器 (Triggers) 部分,点击 下拉菜单,选择转到状态 (Go to State) 动作,并在动作设置中设置:
- 项 (Item) 为使用要迁移的状态下的状态机的节点
- 状态 (State) 为希望节点迁移的状态
- 为您在此程序中之前创建的所有状态重复上一步。
例如,为各状态创建按钮 (Button) 节点,为各按钮的按钮: 点击 (Button:Click) 触发器添加转到状态 (Go to State) 动作。
点击创建的按钮之一时,将触发执行动作的触发器,该动作使状态机进入该动作中设置的状态。
将状态机设置成下一个或上一个状态
使用下一状态 (Next State) 和上一状态 (Previous State) 动作将状态机设置成该状态组中的下一个或上一个状态。请参阅使用状态组。
要将状态机设置成下一个或上一个状态:
- 创建内容,您要定义其处于不同状态时的外观和行为。
例如,使用出厂内容 (Factory Content) 中的汽车 (Car)。 请参阅使用出厂内容 (Factory Content) 资产。
- 创建状态机和状态,您可在其中设置您在上一步中创建的内容的外观和行为。请参阅创建状态机。
例如,为 Camera_Root 节点创建一个状态机,有三个状态,名称分别为 Brakes、Roof 和 Suspension,每种都从不同角度显示汽车。请参阅使用摄像机 (Camera) 节点。
- 创建或选择要用于将应用程序设置成状态机中下一个或上一个状态的节点,为该节点添加用于更改状态的触发器。
例如,创建一个按钮 (Button) 节点并向其添加一个按钮: 点击 (Button:Click) 触发器。请参阅使用触发器。
- 在用于将状态更改为下一个或上一个状态的触发器中,添加并配置下一状态 (Next State) 或上一状态 (Previous State) 动作。
例如,在节点组件 (Node Components) > 触发器 (Triggers) 部分的按钮: 点击 (Button:Click) 触发器中点击 下拉菜单,选择下一状态 (Next State) 动作,在动作设置中设置:
- 目标项 (Target Item) 为包含要更改状态的状态机的节点
- 状态组 (State Group) 为包含要迁移状态的状态组
- (可选) 循环状态 (Loop State) 为启用,让状态机在达到最后一个状态后返回到第一个状态
- (可选) 立即 (Immediate) 为禁用,以将状态机设置为使用在状态机中设置的状态迁移动画。启用此属性时,状态机立即更改状态,不会播放迁移动画。请参阅使用状态迁移。
点击该按钮时,将触发执行动作的触发器,该动作使状态机进入该动作中设置的状态。
节点进入或离开某个状态时的反应
当节点在两个状态之间迁移时,Kanzi:
- 取消应用节点退出的状态,断开该状态的触发器。
- 发送
LeftStateMessage
消息。 - 应用节点进入的状态,连接该状态的触发器。
- 发送
EnteredStateMessage
消息。
要在节点进入状态时作出反应,可以使用该节点中的已输入状态 (Entered State) 触发器或者该节点进入的状态中的附加时 (On Attached) 触发器。要在节点退出状态作出反应,使用该节点中的左边状态 (Left State) 触发器。
要在节点进入或离开某个状态时作出反应:
- 在工程 (Project) 中选择要对进入或退出状态作出反应的节点,在节点组件 (Node Components) 中添加以下任一项:
- 已输入状态 (Entered State) 触发器,以在节点进入状态时作出反应
- 左边状态 (Left State) 触发器,以在节点退出状态时作出反应
例如,在工程 (Project) 中选择使用含两个状态的状态机的3D 文本块 (Text Block 3D) 节点,State A 和State B,并在节点组件 (Node Components) > 触发器 (Triggers) 部分添加左边状态 (Left State) 触发器。使用左边状态 (Left State) 触发器,在3D 文本块 (Text Block 3D) 节点退出State A 时作出反应。
- 在节点组件 (Node Components) > 触发器 (Triggers) 部分中,为您在上一步中添加的触发器点击 的下拉菜单,然后选择动作。
例如,选择写入日志 (Write Log) 动作并输入在触发器触发时要写入日志 (Log) 窗口的消息。要验证节点是否接收到输入,写入日志 (Write Log) 动作非常有用。
- 在节点组件 (Node Components) > 触发器 (Triggers) 部分中,在第一步中创建的触发器中,点击触发器设置 (Trigger Settings) 以打开触发器设置编辑器 (Trigger Settings Editor)。
在触发器设置编辑器 (Trigger Settings Editor) 中点击添加条件 (Add condition) 可添加条件到该触发器,并在触发器条件编辑器 (Trigger Condition Editor) 中设置您要用于该触发器的条件。请参阅使用消息中的值创建条件。
例如,对于左边状态 (Left State) 触发器,设置:- 值 A (Value A)
- 起始值 (Value From) 为消息 (Message)
- 参数 (Argument) 为状态 (State)
- 运算符 (Operator) 为=
- 值 B (Value B)
- 起始值 (Value From) 为固定 (Fixed)
- 固定值 (Fixed Value) 为触发器要作出反应的状态名称
例如,将其设为State A。
当节点退出您在触发器状态中指定的状态时,Kanzi 在日志 (Log) 窗口中打印在写入日志 (Write Log) 动作中输入的消息。要打开日志 (Log) 窗口,在主菜单中选择 > 日志 (Log)。
使用状态组
状态组包含各种状态,定义控制器属性和状态组中状态之间的迁移。使用状态组顺利控制应用程序中的状态和迁移。例如,按钮的状态机可以包含三个状态组:按钮已按下、按钮已松开以及将鼠标悬停在按钮上方。在您创建状态的每个状态组中,它们使用状态对象定义在每种状态下按钮的行为方式。
要使用状态组:
- 在状态工具 (State Tools) 中点击+ 创建状态组 (+ Create State Group) 以创建状态组,并为您创建的状态组输入名称。
- 在状态工具 (State Tools) 中,将鼠标指针悬停在状态组的上方,以设置状态组记录的属性。设置不同的状态组,以记录不同的属性值的变化。使用全部 (All) 选择或取消选择所有属性。
要复制或移除某个状态组,将鼠标悬停在状态组上方并选择重复 (Duplicate) 或移除 (Remove)。
在 API 中使用状态机
有关详细信息,请参阅 API reference中的 StateManager
类。
另请参阅
教程:使用状态机控制您的应用程序
教程:创建按钮
教程:创建切换按钮
教程:创建组合仪表指示灯
状态机
使用状态迁移
使用按钮 (Button) 节点
使用切换按钮 (Toggle Button) 节点
属性系统
属性类型
使用触发器
打开导航